//网络模块：负责与服务器的连接和消息的发送和接收
//receive_messages：接收服务器发送的消息。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include "network.h"
#include <sys/socket.h> 
#include "config.h"

/**
 *  接收服务器发送的消息，此函数会在线程中运行。
 * 
 * 该函数持续从指定的套接字接收服务器发送的消息，
 * 若接收到有效消息则将其打印到控制台，若连接断开则退出程序。
 * 
 *  arg 指向存储套接字文件描述符的指针，需要进行类型转换。
 *  return void* 该函数无实际返回值，按约定返回 NULL。
 */
void *receive_messages(void *arg) {
    // 将传入的参数转换为 int 指针并解引用，获取套接字文件描述符
    int sockfd = *((int *)arg);
    // 定义一个缓冲区，用于存储从服务器接收的消息
    char buffer[BUFFER_SIZE];
    
    // 进入无限循环，持续接收服务器消息
    while (1) {
        // 将缓冲区清零，确保每次接收消息前缓冲区为空
        memset(buffer, 0, BUFFER_SIZE);
        // 从套接字接收消息，返回接收到的字节数
        int bytes_recv = recv(sockfd, buffer, BUFFER_SIZE, 0);
        // 检查接收到的字节数，若小于等于 0 表示连接已断开
        if (bytes_recv <= 0) {
            // 打印连接断开的提示信息
            printf("与服务器的连接已断开\n");
            // 正常退出程序
            exit(EXIT_SUCCESS);
        }
        // 若接收到有效消息，将其打印到控制台
        printf("%s", buffer);
    }
    // 按约定返回 NULL
    return NULL;
}
